﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

/// <summary>
/// CDatabase의 요약 설명입니다.
/// </summary>
public class CDatabase
{
    protected SqlConnection _conn = null;

    public void GetConnection()
    {
        try
        {
            _conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["DSN"]);
            _conn.Open();
        }
        catch (Exception e)
        {
            throw (new Exception("DB 접속 실패"));
        }
    }

    public void GetConnection(bool isreadonly)
    {
        try
        {
            if (isreadonly)
                _conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["DSN_SUB"]);
            else
                _conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["DSN"]);

            _conn.Open();
        }
        catch (Exception e1)
        {
            if (isreadonly)
            {
                try
                {
                    _conn = new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["DSN"]);
                    _conn.Open();
                }
                catch (Exception e2)
                {
                    throw (new Exception("DB 접속 실패"));
                }
            }
            else
               throw (new Exception("DB 접속 실패"));
        }
    }

    public void ReleaseConnection()
    {
        if (_conn == null)
            return;

        try
        {
            _conn.Close();
            _conn.Dispose();
            _conn = null;
        }
        catch (Exception e)
        { }
    }

    ~CDatabase()
    {
        if (_conn != null)
        {
            ReleaseConnection();
        }
    }

    // 삭제, 수정, 추가등 결과값을 반환하지 않는 SQL문을 실행하는 함수
    public bool ExecuteSQL(string pSQL)
    {
        pSQL = "SET XACT_ABORT ON\n Begin Tran \n " + pSQL + "\n Commit Tran";

        try
        {
            SqlCommand comd = new SqlCommand(pSQL, _conn);
            comd.ExecuteNonQuery();
            comd.Dispose();
        }
        catch (Exception e)
        {
            CSiteUtility.WriteLog(e.Message, pSQL);

            throw (new Exception("DB 쿼리문 수행중 오류 발생"));
        }

        return true;
    }

    // 삭제, 수정, 추가등 결과값을 반환하지 않는 SQL문을 실행하는 함수
    public bool ExecuteSQL(string pSQL, SqlParameter[] pParams)
    {
        try
        {
            SqlCommand comd = new SqlCommand(pSQL, _conn);
            comd.CommandType = CommandType.StoredProcedure;

            if (pParams != null)
            {
                for (int i = 0; i < pParams.Length; i++)
                    comd.Parameters.Add(pParams[i]);
            }

            comd.ExecuteNonQuery();
            comd.Dispose();
        }
        catch (Exception e)
        {
            CSiteUtility.WriteLog(e.Message, pSQL);

            throw (new Exception("DB 쿼리문 수행중 오류 발생"));
        }

        return true;
    }

    // Count와 같은 숫자 1개의 결과만을 가져올 때 사용하는 함수
    public int GetQueryInt(string pSQL)
    {
        int result = 0;

        try
        {
            SqlCommand comd = new SqlCommand(pSQL, _conn);
            SqlDataReader dr = comd.ExecuteReader();
            comd.Dispose();

            if (dr.Read())
            {
                string sresult = dr.GetSqlValue(0).ToString();
                result = Convert.ToInt32(sresult);
            }

            dr.Close();
        }
        catch (Exception e)
        {
            CSiteUtility.WriteLog(e.Message, pSQL);

            throw (new Exception("DB 쿼리문 수행중 오류 발생"));
        }

        return result;
    }

    // 문자열 하나만의 결과를 가져올 때 사용하는 함수
    public string GetQueryString(string pSQL)
    {
        string result = "";

        try
        {
            SqlCommand comd = new SqlCommand(pSQL, _conn);
            SqlDataReader dr = comd.ExecuteReader();
            comd.Dispose();

            if (dr.Read())
                result = dr.GetSqlValue(0).ToString();

            dr.Close();
        }
        catch (Exception e)
        {
            CSiteUtility.WriteLog(e.Message, pSQL);

            throw (new Exception("DB 쿼리문 수행중 오류 발생"));
        }

        return result;
    }

    // 문자열 하나만의 결과를 가져올 때 사용하는 함수
    public string GetQueryString(string pSQL, SqlParameter[] pParams)
    {
        string result = "";

        try
        {
            SqlCommand comd = new SqlCommand(pSQL, _conn);
            comd.CommandType = CommandType.StoredProcedure;

            if (pParams != null)
            {
                for (int i = 0; i < pParams.Length; i++)
                    comd.Parameters.Add(pParams[i]);
            }

            SqlDataReader dr = comd.ExecuteReader();
            comd.Dispose();

            if (dr.Read())
                result = dr.GetSqlValue(0).ToString();

            dr.Close();
        }
        catch (Exception e)
        {
            CSiteUtility.WriteLog(e.Message, pSQL);

            throw (new Exception("DB 쿼리문 수행중 오류 발생"));
        }

        return result;
    }

    // 문자열 하나만의 결과를 가져올 때 사용하는 함수
    public string GetQueryString(string pSQL, SqlParameter[] pParams, int resultpos)
    {
        string result = "";

        try
        {
            SqlCommand comd = new SqlCommand(pSQL, _conn);
            comd.CommandType = CommandType.StoredProcedure;

            if (pParams != null)
            {
                for (int i = 0; i < pParams.Length; i++)
                    comd.Parameters.Add(pParams[i]);
            }

            SqlDataReader dr = comd.ExecuteReader();
            comd.Dispose();

            for (int i = 0; i < resultpos; i++)
                dr.NextResult();

            if (dr.Read())
                result = dr.GetSqlValue(0).ToString();

            dr.Close();
        }
        catch (Exception e)
        {
            CSiteUtility.WriteLog(e.Message, pSQL);

            throw (new Exception("DB 쿼리문 수행중 오류 발생"));
        }

        return result;
    }

    // 문자열 하나만의 결과를 가져올 때 사용하는 함수
    public string GetQueryString(string pSQL, SqlParameter[] pParams, int resultpos, int resultcolumn)
    {
        string result = "";

        try
        {
            SqlCommand comd = new SqlCommand(pSQL, _conn);
            comd.CommandType = CommandType.StoredProcedure;

            if (pParams != null)
            {
                for (int i = 0; i < pParams.Length; i++)
                    comd.Parameters.Add(pParams[i]);
            }

            SqlDataReader dr = comd.ExecuteReader();
            comd.Dispose();

            for (int i = 0; i < resultpos; i++)
                dr.NextResult();

            if (dr.Read())
                result = dr.GetSqlValue(resultcolumn).ToString();

            dr.Close();
        }
        catch (Exception e)
        {
            CSiteUtility.WriteLog(e.Message, pSQL);

            throw (new Exception("DB 쿼리문 수행중 오류 발생"));
        }

        return result;
    }

    // 문자열 하나만의 결과를 가져올 때 사용하는 함수 - Transaction 적용
    public string GetQueryStringTran(string pSQL)
    {
        pSQL = "SET XACT_ABORT ON\n Begin Tran \n " + pSQL + "\n Commit Tran";
        string result = "";

        try
        {
            SqlCommand comd = new SqlCommand(pSQL, _conn);
            SqlDataReader dr = comd.ExecuteReader();
            comd.Dispose();

            if (dr.Read())
                result = dr.GetSqlValue(0).ToString();

            dr.Close();
        }
        catch (Exception e)
        {
            CSiteUtility.WriteLog(e.Message, pSQL);

            throw (new Exception("DB 쿼리문 수행중 오류 발생"));
        }

        return result;
    }

    // 쿼리문에 해당하는 레코드셋을 반환하는 함수
    public SqlDataReader GetQueryResult(string pSQL)
    {
        SqlDataReader dr = null;

        try
        {
            SqlCommand comd = new SqlCommand(pSQL, _conn);
            comd.CommandTimeout = 60 * 10;
            dr = comd.ExecuteReader();
            comd.Dispose();
        }
        catch (Exception e)
        {
            CSiteUtility.WriteLog(e.Message, pSQL);

            throw (new Exception("DB 쿼리문 수행중 오류 발생"));
        }

        return dr;
    }

    // 쿼리문에 해당하는 레코드셋을 반환하는 함수
    public SqlDataReader GetQueryResult(string pSQL, SqlParameter[] pParams)
    {
        SqlDataReader dr = null;

        try
        {
            SqlCommand comd = new SqlCommand(pSQL, _conn);
            comd.CommandType = CommandType.StoredProcedure;

            if (pParams != null)
            {
                for (int i = 0; i < pParams.Length; i++)
                    comd.Parameters.Add(pParams[i]);
            }

            comd.CommandTimeout = 60 * 10;
            dr = comd.ExecuteReader();
            comd.Dispose();
        }
        catch (Exception e)
        {
            CSiteUtility.WriteLog(e.Message, pSQL);

            throw (new Exception("DB 쿼리문 수행중 오류 발생"));
        }

        return dr;
    }
}
